package com.shangke.corejava.ch2;
//import java.awt.print.Printable;
public class Operater {
	public static void main(String[] args) {
		String i = "Hello";
		
		//instanceof 用于判断某个对象是否是特定的数据类型，在反射或集合编程时常用
		if (i instanceof String){
			System.out.println("i的类型时字符串");
		}
		
		System.out.println("------------------1----------------------");
		
		//运算符号的优先级别
		//算术运算 > 比较运算 > 逻辑运算
		
		//++ 和 --
		int k = 2 ;
		k+= ++k-k--*++k;
		//先算赋值符号的右边，运算级别高的先算，按照四则运算的顺序进行计算
		//++、--、*、+、-（上述的符号的运算级别）
		//++k就是2+1=3，然后最右边的++k就是3+1=4，再是k--*++k就是k先与其它变量进行计算3*（），
		//再自减和++k就是3*（（3-1）+1），里面的（3-1）就是自减，这时k=2,K++就是先 自加（3-1）+1，结果就是k=2+(3-3*((3-1)+1))=2-6=-4
		System.out.println(k);
		
		System.out.println("-------------------2---------------------");
		
		//+号运算符号：1.做数值运算的加法运算；2.字符串的连接
		int m = 10;
		char c = '中';
		
		//数字+字符  = 数字+字符的编码索引值
		int str = m+c;//自动转换类型：把字符char类型自动转换为int类型
		System.out.println(str);//计算的结果是int类型，是数值类型
		
		String str2 = ""+m+c;//字符串+任何的数值类，会把数值转换为数值字符串，计算结果也是字符串
		System.out.println(str2);
		
		String str3 = m+c+"";//满足四则运算：从左到右进行计算
		System.out.println(str3);//计算的结果与上面的数值型结果一样，但是这里的计算的结果是string类型，是字符串类型，对象类型
		
		System.out.println("-------------------3---------------------");
		
		//逻辑运算：逻辑运算的结果都是boolean值：true,false
		//比较运算符的运算结果也是boolean值
		boolean b =  m*(m+c) > c*c; //算术运算的优先级别高于比较运算，比较运算符的级别高于逻辑运算符。语句中先算算术运算，再算比较运算
		System.out.println(b);
		
		//对于复杂的表达式，需要掌握根据运算符号的优先级别进行拆分表达式
		//按照运算级别从低到高进行拆分，运算则按照从高到低进行运算
		b = m*(m+c) >c*c && m*(m+c) >c || m*(m+c) >c;//真值表
		//先进行||，所以把上述的式子从||分开来，分为两个整体
		System.out.println(b);
		
		System.out.println("-------------------4---------------------");
		
		
		//逻辑运算的短路
		//在进行逻辑或运算时，可能会出现短路现象：当有多个或运算进行串联时，会从左到右进行计算，当左边有一个为真时，右边所有的计算都被短路（就是运算中止在前面的运算，后面的逻辑没有进行）
		//左面的表达式为true，则不会计算右面的表达式
		if(2>1 || 2+3>0 && false){
			System.out.println("大于0");
		}
		
		
		//在进行逻辑与运算时，可能出现短路想象：当有多个与运算进行串联时，会从左到右进行运算，当左边有任一个表达式为假时，右边所有的计算都被短路
		if(2+3>5 && false && 2>1){  //这里的运算是：true && false && true  //左面的表达式为false，则不会计算右面的表达式
			System.out.println("大于0");
		}
		
		//byte，short 和 char 进行算术运算时，会自动转换为int类型再进行计算，它们的计算结果为int类型
		byte b1 = 12;
		short b2 = 14;
		char c1 = 'A';
		//b1 = b1+b1;  算术运算后的结果是int类型，不能直接保存到byte类型中
		int i1 = b1+b1;
		//s1 = b1+s1;  算术运算后的结果是int类型，不能直接保存到int类型中
		//c1 = c1+12;  算术运算后的结果是int类型，不能直接保存到char类型中
		
		long l1 = 1234;
		//int i2 = i1+l1;（错误） int类型+long类型，小范围的数据类型与大范围的数据类型进行算术运算，会先把小范围的数据自动转换为大范围的数据，再进行计算
		l1 = i1+l1;
		
		//强制类型转换
		//大范围的数据转换为小范围的数据需要进行类型的强制转换，小数据类型  =（小数据类型）大数据值
		//数据类型强制转换会导致数据精度的损失，高数据位会全部损失掉；如果是小数转整数会把小数部分全部损失掉
	}
}
